/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fcab;

/**
 *
 * @author Richard
 */
public class FCAB {

    /******************************************************************************
        NAME:       PCT_EJEC_ACT_PROG_PROY
        PURPOSE:    Ejecuta el calculo de proyeccion.
    ******************************************************************************/
    public static pct_ejec_act_prog_proy(String p_llamado, int p_estado, String p_msg){
        int vl_prog;		//pct_pg_programa_trenes.pk_nro_prog_trenes%type;
        int vl_prog_proy;	//pct_pg_programa_trenes.pk_nro_prog_trenes%type;
        String vl_sqlerr_val;	//varchar2(200);
        String vl_msg;  	//varchar2(200) := '*';
        vl_msg = '*';
        
        char vl_entro;          //varchar2(1);
        int vl_indice;		//number(1);
        String vl_error;	//exception;
        String vl_fecha;	//date; resolver manejo de fechas en Java
    }
    
    public static void main(String[] args) {
        // TODO code application logic here
        
        System.out.print("FCAB!"+"\n123");
        System.out.print("FCAB!"+"\n122313131313123");
        System.out.print("HOLA MUNDO CTM");
        
       -- solo los programas proyectados del dia del ejecutado que no estan siendo calculados 
cursor c_prog_invalidos is
	select	distinct st.nro_programa nro_prog
		from	pct_pg_tmp_stack_depen_trenes st,
		        pct_pg_programa_trenes pt
	where pt.pk_nro_prog_trenes = st.nro_programa
	  and pt.tipo_prog_trenes = 'Y'
	  and pt.fecha_prog_trenes <= sysdate
	  and pt.estado_proceso <> 'ACTIVO'
	  and pt.estado_programa <> 'TERMINADO'; 

cursor c_prog is -- solo los programas proyectados del dia del ejecutado
	select	distinct st.nro_programa nro_prog
		from	pct_pg_tmp_stack_depen_trenes st,
		        pct_pg_programa_trenes pt
	where pt.pk_nro_prog_trenes = st.nro_programa
	  and pt.tipo_prog_trenes = 'Y'
	  and pt.fecha_prog_trenes <= sysdate
	  and pt.estado_proceso = 'ACTIVO'
	  and pt.estado_programa <> 'TERMINADO';

cursor c_desbloquear_prog is
	select	pt.pk_nro_prog_trenes nro_prog
	  from	pct_pg_programa_trenes pt
	where pt.tipo_prog_trenes = 'Y'
	  --and pt.estado_proceso = 'ACTIVO'
	  and pt.nro_proceso	= 50
	  and pt.estado_programa <> 'TERMINADO'; 
/*	select	nro_programa
	from	pct_pg_tmp_programas
	where	param_1 = 'ACT_PROY';*/

cursor c_prog_activos_stack is	
	select distinct st.nro_programa nro_prog
					from pct_pg_programa_trenes pt, pct_pg_tmp_stack_depen_trenes st
				where pt.pk_nro_prog_trenes = st.nro_programa
				  and pt.tipo_prog_trenes = 'Y'
				  and pt.estado_programa <> 'TERMINADO';

cursor c_prog_activos is	
	select pt.pk_nro_prog_trenes nro_prog
	  from pct_pg_programa_trenes pt
	 where pt.tipo_prog_trenes = 'Y'
	   and pt.estado_programa <> 'TERMINADO';

vl_estado_proceso varchar2(15);
vl_hora_inicio    date;				  
begin
    if p_llamado not in ('MANUAL') then -- 'AUTOMATICO',Inhabilitar ejecucion
	  return;
	end if;
	
	-- bloquear modificaciones 
	--return;
  -- valor_param_1 se le da formato fecha de tipo dia/mes/año Hora:Minutos:Segundos
	select to_date(valor_param_1,'DD/MM/YYYY HH24:MI:SS') 
	  into vl_hora_inicio 
	  from pct_parametros_det
	where pfk_cod_param = 49
	  and pk_cod_detalle = '1';
-- le suma 15minutos a la hora inicio
	if sysdate < vl_hora_inicio+(15/1440) and p_llamado = 'AUTOMATICO' then
	   return;
	end if;
	  	--#Procedimiento 1
	Pct_Actualizar_Hora_Ejec_Proy(sysdate, 'INICIO');
	commit;
	
	vl_entro := 'N';
	for i in c_prog_activos_stack loop

		--Pct_Prog_Tren_Reg_Estado(i.nro_prog, 50, 'ACTIVO');

		begin
			select estado
			  into vl_estado_proceso
			  from pct_pg_tmp_estado_cal_proy
			 where nro_prog_trenes = i.nro_prog;
		exception
		   when no_data_found then
		      vl_estado_proceso := 'PROCESADO';
		end;
		
		if vl_estado_proceso <> 'ACTIVO' then
    -- #Procedimiento 2
		   Pct_Pg_Reg_Estado_Prog_Proy(i.nro_prog, 'ACTIVO');
		   vl_entro := 'S';
		end if;

	end loop;
	if vl_entro = 'S' then
	   commit;
		for j in c_prog_activos_stack loop
			vl_prog := j.nro_prog;
			--select sysdate into vl_fecha from dual;
			--#Procedimiento 3  
			Pct_Ejec_Recalcular_Tiempo(vl_prog, p_estado, vl_msg);
			
			--INSERT INTO PCT_PG_LOGS(FECHA, DESCRIPCION, PARAMETRO1, PARAMETRO2) VALUES (SYSDATE,'4.2 FIN DE RECALCULO DE TIEMPO',vl_prog,(sysdate-vl_fecha)*86400);
			if vl_msg <> 'OK' then
			   raise vl_error;
			end if;
			--select sysdate into vl_fecha from dual;
			--#procedimiento 4
			Pct_Pg_Act_Tpo_Llegada_Tren(vl_prog, p_msg);
			--INSERT INTO PCT_PG_LOGS(FECHA, DESCRIPCION, PARAMETRO1, PARAMETRO2) VALUES (SYSDATE,'4.4 FIN DE ACTUALIZACION DE TPO LLEGADA TREN',vl_prog,(sysdate-vl_fecha)*86400);
			-- desbloquear modificaciones 
			--pct_prog_tren_reg_estado(vl_prog, 50, 'PROCESADO');
			-- # Procedimiento 5
			Pct_Pg_Reg_Estado_Prog_Proy(j.nro_prog, 'PROCESADO');
		end loop;
	else -- No trenes en el stack
	    -- Implica actualizar tiempos y calculo de cruzas y esperas
		-- actualizar tiempo inicio proyeccion 
		p_msg := p_msg||' * Ajustar tiempo proyeccion\n';
		vl_indice := 0;
		
		for k in c_prog_activos loop -- proyectados activos 

			begin
				select estado
				  into vl_estado_proceso
				  from pct_pg_tmp_estado_cal_proy
				 where nro_prog_trenes = k.nro_prog;
			exception
			   when no_data_found then
			      vl_estado_proceso := 'PROCESADO';
			end;
			
			if vl_estado_proceso <> 'ACTIVO' then
      --#Procedimiento #6
			   Pct_Pg_Reg_Estado_Prog_Proy(k.nro_prog, 'ACTIVO');
			   vl_entro := 'S';
			end if;
            
        end loop;
		
		if vl_entro = 'S' then
		    commit;
			
			for m in c_prog_activos loop -- proyectados activos 
	
				vl_prog_proy := m.nro_prog;
	
				for p in (	select	tn.pk_nro_tren, tn.pk_fecha_tren
							from	pct_pg_trenes tn
							where	tn.pfk_nro_prog_trenes = vl_prog_proy
							and		tn.estado_tren not in ('INICIADO','TERMINADO','PROYECTADO'))
				loop
					--# Procedimiento #7
					Pct_Proy_Act_Tiempos(vl_prog_proy, p.pk_nro_tren, p.pk_fecha_tren);

				end loop; 
					
				-- Resolver Cruzas 
				p_msg := p_msg||' * Cruzas\n';
				--select sysdate into vl_fecha from dual;
				-- # Procedimiento #8
				Pct_Pg_Resolver_Cruzas(vl_prog_proy, vl_msg);
				--INSERT INTO PCT_PG_LOGS(FECHA, DESCRIPCION, PARAMETRO1, PARAMETRO2) VALUES (SYSDATE,'8.2 FIN DE RESOLVER CRUZAS',vl_prog_proy,(sysdate-vl_fecha)*86400);
				
				if vl_msg <> 'OK' then
				   raise vl_error;
				end if;
				--select sysdate into vl_fecha from dual;
				-- # Procedimiento #9 
				Pct_Pg_Act_Tpo_Llegada_Tren(vl_prog_proy, p_msg);
				--INSERT INTO PCT_PG_LOGS(FECHA, DESCRIPCION, PARAMETRO1, PARAMETRO2) VALUES (SYSDATE,'8.4 FIN ACTUALIZACION DE TPO LLEGADA TREN',vl_prog_proy,(sysdate-vl_fecha)*86400);
				
				--pct_prog_tren_reg_estado(vl_prog_proy, 50, 'PROCESADO');
				-- # Procedimiento #10
				Pct_Pg_Reg_Estado_Prog_Proy(m.nro_prog, 'PROCESADO');
			end loop;
			
		end if;
	end if;
	-- # Procedimiento #11
	Pct_Actualizar_Hora_Ejec_Proy(sysdate, 'FINAL');

	commit;
	
	 p_msg :='OK';
      
exception
    when vl_error then
	   p_msg := substr('Error : ' ||vl_msg||' \n'|| sqlerrm,1,200);
		rollback;
		for n in (select rowid
                    from pct_pg_tmp_estado_cal_proy
				where estado ='ACTIVO') loop
			-- desbloquear modificaciones 
			--pct_prog_tren_reg_estado(n.nro_prog, 50, 'NO PROCESADO');
			update pct_pg_tmp_estado_cal_proy
			   set estado ='PROCESADO'
			 where rowid = n.rowid;
			
		end loop;
		commit;
	when others then
		vl_sqlerr_val  := substr( sqlerrm,1,200);
		p_estado := 1;
		p_msg := 'Error : ' ||vl_msg||' \n'|| vl_sqlerr_val;
		rollback;
		for n in (select rowid
                    from pct_pg_tmp_estado_cal_proy
				where estado ='ACTIVO') loop
			-- desbloquear modificaciones 
			--pct_prog_tren_reg_estado(n.nro_prog, 50, 'NO PROCESADO');
			update pct_pg_tmp_estado_cal_proy
			   set estado ='PROCESADO'
			 where rowid = n.rowid;
			
		end loop;
		commit;
end;
        
    }
}
